# Copyright (c) 2020 Huawei Technologies Co.,Ltd.
#
# openGauss is licensed under Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#
#          http://license.coscl.org.cn/MulanPSL2
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.
import multiprocessing

from dbmind.common.algorithm import anomaly_detection
from dbmind.common.types import Sequence

cpus = multiprocessing.cpu_count()
pool = multiprocessing.Pool(cpus)
test_spike_timestamps = [1636992000, 1636992060, 1636992120, 1636992180, 1636992240, 1636992300, 1636992360, 1636992420,
                         1636992480, 1636992540, 1636992600, 1636992660, 1636992720, 1636992780, 1636992840, 1636992900,
                         1636992960, 1636993020, 1636993080, 1636993140, 1636993200, 1636993260, 1636993320, 1636993380,
                         1636993440, 1636993500, 1636993560, 1636993620, 1636993680, 1636993740, 1636993800, 1636993860,
                         1636993920, 1636993980, 1636994040, 1636994100, 1636994160, 1636994220, 1636994280, 1636994340,
                         1636994400, 1636994460, 1636994520, 1636994580, 1636994640, 1636994700, 1636994760, 1636994820,
                         1636994880, 1636994940, 1636995000, 1636995060, 1636995120, 1636995180, 1636995240, 1636995300,
                         1636995360, 1636995420, 1636995480, 1636995540, 1636995600, 1636995660, 1636995720, 1636995780,
                         1636995840, 1636995900, 1636995960, 1636996020, 1636996080, 1636996140, 1636996200, 1636996260,
                         1636996320, 1636996380, 1636996440, 1636996500, 1636996560, 1636996620, 1636996680, 1636996740,
                         1636996800, 1636996860, 1636996920, 1636996980, 1636997040, 1636997100, 1636997160, 1636997220,
                         1636997280, 1636997340, 1636997400, 1636997460, 1636997520, 1636997580, 1636997640, 1636997700,
                         1636997760, 1636997820, 1636997880, 1636997940, 1636998000, 1636998060, 1636998120, 1636998180,
                         1636998240, 1636998300, 1636998360, 1636998420, 1636998480, 1636998540, 1636998600, 1636998660,
                         1636998720, 1636998780, 1636998840, 1636998900, 1636998960, 1636999020, 1636999080, 1636999140,
                         1636999200, 1636999260, 1636999320, 1636999380, 1636999440, 1636999500, 1636999560, 1636999620,
                         1636999680, 1636999740, 1636999800, 1636999860, 1636999920, 1636999980, 1637000040, 1637000100,
                         1637000160, 1637000220, 1637000280, 1637000340, 1637000400, 1637000460, 1637000520, 1637000580,
                         1637000640, 1637000700, 1637000760, 1637000820, 1637000880, 1637000940, 1637001000, 1637001060,
                         1637001120, 1637001180, 1637001240, 1637001300, 1637001360, 1637001420, 1637001480, 1637001540,
                         1637001600, 1637001660, 1637001720, 1637001780, 1637001840, 1637001900, 1637001960, 1637002020,
                         1637002080, 1637002140, 1637002200, 1637002260, 1637002320, 1637002380, 1637002440, 1637002500,
                         1637002560, 1637002620, 1637002680, 1637002740, 1637002800, 1637002860, 1637002920, 1637002980,
                         1637003040, 1637003100, 1637003160, 1637003220, 1637003280, 1637003340, 1637003400, 1637003460,
                         1637003520, 1637003580, 1637003640, 1637003700, 1637003760, 1637003820, 1637003880, 1637003940,
                         1637004000, 1637004060, 1637004120, 1637004180, 1637004240, 1637004300, 1637004360, 1637004420,
                         1637004480, 1637004540, 1637004600, 1637004660, 1637004720, 1637004780, 1637004840, 1637004900,
                         1637004960, 1637005020, 1637005080, 1637005140, 1637005200, 1637005260, 1637005320, 1637005380,
                         1637005440, 1637005500, 1637005560, 1637005620, 1637005680, 1637005740, 1637005800, 1637005860,
                         1637005920, 1637005980, 1637006040, 1637006100, 1637006160, 1637006220, 1637006280, 1637006340,
                         1637006400, 1637006460, 1637006520, 1637006580, 1637006640, 1637006700, 1637006760, 1637006820,
                         1637006880, 1637006940, 1637007000, 1637007060, 1637007120, 1637007180, 1637007240, 1637007300,
                         1637007360, 1637007420, 1637007480, 1637007540, 1637007600, 1637007660, 1637007720, 1637007780,
                         1637007840, 1637007900, 1637007960, 1637008020, 1637008080, 1637008140, 1637008200, 1637008260,
                         1637008320, 1637008380, 1637008440, 1637008500, 1637008560, 1637008620, 1637008680, 1637008740,
                         1637008800, 1637008860, 1637008920, 1637008980, 1637009040, 1637009100, 1637009160, 1637009220,
                         1637009280, 1637009340, 1637009400, 1637009460, 1637009520, 1637009580, 1637009640, 1637009700,
                         1637009760, 1637009820, 1637009880, 1637009940, 1637010000, 1637010060, 1637010120, 1637010180,
                         1637010240, 1637010300, 1637010360, 1637010420, 1637010480, 1637010540, 1637010600, 1637010660,
                         1637010720, 1637010780, 1637010840, 1637010900, 1637010960, 1637011020, 1637011080, 1637011140,
                         1637011200, 1637011260, 1637011320, 1637011380, 1637011440, 1637011500, 1637011560, 1637011620,
                         1637011680, 1637011740, 1637011800, 1637011860, 1637011920, 1637011980, 1637012040, 1637012100,
                         1637012160, 1637012220, 1637012280, 1637012340, 1637012400, 1637012460, 1637012520, 1637012580,
                         1637012640, 1637012700, 1637012760, 1637012820, 1637012880, 1637012940, 1637013000, 1637013060,
                         1637013120, 1637013180, 1637013240, 1637013300, 1637013360, 1637013420, 1637013480, 1637013540,
                         1637013600, 1637013660, 1637013720, 1637013780, 1637013840, 1637013900, 1637013960, 1637014020,
                         1637014080, 1637014140, 1637014200, 1637014260, 1637014320, 1637014380, 1637014440, 1637014500,
                         1637014560, 1637014620, 1637014680, 1637014740, 1637014800, 1637014860, 1637014920, 1637014980,
                         1637015040, 1637015100, 1637015160, 1637015220, 1637015280, 1637015340, 1637015400, 1637015460,
                         1637015520, 1637015580, 1637015640, 1637015700, 1637015760, 1637015820, 1637015880, 1637015940,
                         1637016000, 1637016060, 1637016120, 1637016180, 1637016240, 1637016300, 1637016360, 1637016420,
                         1637016480, 1637016540, 1637016600, 1637016660, 1637016720, 1637016780, 1637016840, 1637016900,
                         1637016960, 1637017020, 1637017080, 1637017140, 1637017200, 1637017260, 1637017320, 1637017380,
                         1637017440, 1637017500, 1637017560, 1637017620, 1637017680, 1637017740, 1637017800, 1637017860,
                         1637017920, 1637017980, 1637018040, 1637018100, 1637018160, 1637018220, 1637018280, 1637018340,
                         1637018400, 1637018460, 1637018520, 1637018580, 1637018640, 1637018700, 1637018760, 1637018820,
                         1637018880, 1637018940, 1637019000, 1637019060, 1637019120, 1637019180, 1637019240, 1637019300,
                         1637019360, 1637019420, 1637019480, 1637019540, 1637019600, 1637019660, 1637019720, 1637019780,
                         1637019840, 1637019900, 1637019960, 1637020020, 1637020080, 1637020140, 1637020200, 1637020260,
                         1637020320, 1637020380, 1637020440, 1637020500, 1637020560, 1637020620, 1637020680, 1637020740,
                         1637020800, 1637020860, 1637020920, 1637020980, 1637021040, 1637021100, 1637021160, 1637021220,
                         1637021280, 1637021340, 1637021400, 1637021460, 1637021520, 1637021580, 1637021640, 1637021700,
                         1637021760, 1637021820, 1637021880, 1637021940, 1637022000, 1637022060, 1637022120, 1637022180,
                         1637022240, 1637022300, 1637022360, 1637022420, 1637022480, 1637022540, 1637022600, 1637022660,
                         1637022720, 1637022780, 1637022840, 1637022900, 1637022960, 1637023020, 1637023080, 1637023140,
                         1637023200, 1637023260, 1637023320, 1637023380, 1637023440, 1637023500, 1637023560, 1637023620,
                         1637023680, 1637023740, 1637023800, 1637023860, 1637023920, 1637023980, 1637024040, 1637024100,
                         1637024160, 1637024220, 1637024280, 1637024340, 1637024400, 1637024460, 1637024520, 1637024580,
                         1637024640, 1637024700, 1637024760, 1637024820, 1637024880, 1637024940, 1637025000, 1637025060,
                         1637025120, 1637025180, 1637025240, 1637025300, 1637025360, 1637025420, 1637025480, 1637025540,
                         1637025600, 1637025660, 1637025720, 1637025780, 1637025840, 1637025900, 1637025960, 1637026020,
                         1637026080, 1637026140, 1637026200, 1637026260, 1637026320, 1637026380, 1637026440, 1637026500,
                         1637026560, 1637026620, 1637026680, 1637026740, 1637026800, 1637026860, 1637026920, 1637026980,
                         1637027040, 1637027100, 1637027160, 1637027220, 1637027280, 1637027340, 1637027400, 1637027460,
                         1637027520, 1637027580, 1637027640, 1637027700, 1637027760, 1637027820, 1637027880, 1637027940,
                         1637028000, 1637028060, 1637028120, 1637028180, 1637028240, 1637028300, 1637028360, 1637028420,
                         1637028480, 1637028540, 1637028600, 1637028660, 1637028720, 1637028780, 1637028840, 1637028900,
                         1637028960, 1637029020, 1637029080, 1637029140, 1637029200, 1637029260, 1637029320, 1637029380,
                         1637029440, 1637029500, 1637029560, 1637029620, 1637029680, 1637029740, 1637029800, 1637029860,
                         1637029920, 1637029980, 1637030040, 1637030100, 1637030160, 1637030220, 1637030280, 1637030340,
                         1637030400, 1637030460, 1637030520, 1637030580, 1637030640, 1637030700, 1637030760, 1637030820,
                         1637030880, 1637030940, 1637031000, 1637031060, 1637031120, 1637031180, 1637031240, 1637031300,
                         1637031360, 1637031420, 1637031480, 1637031540, 1637031600, 1637031660, 1637031720, 1637031780,
                         1637031840, 1637031900, 1637031960, 1637032020, 1637032080, 1637032140, 1637032200, 1637032260,
                         1637032320, 1637032380, 1637032440, 1637032500, 1637032560, 1637032620, 1637032680, 1637032740,
                         1637032800, 1637032860, 1637032920, 1637032980, 1637033040, 1637033100, 1637033160, 1637033220,
                         1637033280, 1637033340, 1637033400, 1637033460, 1637033520, 1637033580, 1637033640, 1637033700,
                         1637033760, 1637033820, 1637033880, 1637033940, 1637034000, 1637034060, 1637034120, 1637034180,
                         1637034240, 1637034300, 1637034360, 1637034420, 1637034480, 1637034540, 1637034600, 1637034660,
                         1637034720, 1637034780, 1637034840, 1637034900, 1637034960, 1637035020, 1637035080, 1637035140,
                         1637035200, 1637035260, 1637035320, 1637035380, 1637035440, 1637035500, 1637035560, 1637035620,
                         1637035680, 1637035740, 1637035800, 1637035860, 1637035920, 1637035980, 1637036040, 1637036100,
                         1637036160, 1637036220, 1637036280, 1637036340, 1637036400, 1637036460, 1637036520, 1637036580,
                         1637036640, 1637036700, 1637036760, 1637036820, 1637036880, 1637036940, 1637037000, 1637037060,
                         1637037120, 1637037180, 1637037240, 1637037300, 1637037360, 1637037420, 1637037480, 1637037540,
                         1637037600, 1637037660, 1637037720, 1637037780, 1637037840, 1637037900, 1637037960, 1637038020,
                         1637038080, 1637038140, 1637038200, 1637038260, 1637038320, 1637038380, 1637038440, 1637038500,
                         1637038560, 1637038620, 1637038680, 1637038740, 1637038800, 1637038860, 1637038920, 1637038980,
                         1637039040, 1637039100, 1637039160, 1637039220, 1637039280, 1637039340, 1637039400, 1637039460,
                         1637039520, 1637039580, 1637039640, 1637039700, 1637039760, 1637039820, 1637039880, 1637039940,
                         1637040000, 1637040060, 1637040120, 1637040180, 1637040240, 1637040300, 1637040360, 1637040420,
                         1637040480, 1637040540, 1637040600, 1637040660, 1637040720, 1637040780, 1637040840, 1637040900,
                         1637040960, 1637041020, 1637041080, 1637041140, 1637041200, 1637041260, 1637041320, 1637041380,
                         1637041440, 1637041500, 1637041560, 1637041620, 1637041680, 1637041740, 1637041800, 1637041860,
                         1637041920, 1637041980, 1637042040, 1637042100, 1637042160, 1637042220, 1637042280, 1637042340,
                         1637042400, 1637042460, 1637042520, 1637042580, 1637042640, 1637042700, 1637042760, 1637042820,
                         1637042880, 1637042940, 1637043000, 1637043060, 1637043120, 1637043180, 1637043240, 1637043300,
                         1637043360, 1637043420, 1637043480, 1637043540, 1637043600, 1637043660, 1637043720, 1637043780,
                         1637043840, 1637043900, 1637043960, 1637044020, 1637044080, 1637044140, 1637044200, 1637044260,
                         1637044320, 1637044380, 1637044440, 1637044500, 1637044560, 1637044620, 1637044680, 1637044740,
                         1637044800, 1637044860, 1637044920, 1637044980, 1637045040, 1637045100, 1637045160, 1637045220,
                         1637045280, 1637045340, 1637045400, 1637045460, 1637045520, 1637045580, 1637045640, 1637045700,
                         1637045760, 1637045820, 1637045880, 1637045940, 1637046000, 1637046060, 1637046120, 1637046180,
                         1637046240, 1637046300, 1637046360, 1637046420, 1637046480, 1637046540, 1637046600, 1637046660,
                         1637046720, 1637046780, 1637046840, 1637046900, 1637046960, 1637047020, 1637047080, 1637047140,
                         1637047200, 1637047260, 1637047320, 1637047380, 1637047440, 1637047500, 1637047560, 1637047620,
                         1637047680, 1637047740, 1637047800, 1637047860, 1637047920, 1637047980, 1637048040, 1637048100,
                         1637048160, 1637048220, 1637048280, 1637048340, 1637048400, 1637048460, 1637048520, 1637048580,
                         1637048640, 1637048700, 1637048760, 1637048820, 1637048880, 1637048940, 1637049000, 1637049060,
                         1637049120, 1637049180, 1637049240, 1637049300, 1637049360, 1637049420, 1637049480, 1637049540,
                         1637049600, 1637049660, 1637049720, 1637049780, 1637049840, 1637049900, 1637049960, 1637050020,
                         1637050080, 1637050140, 1637050200, 1637050260, 1637050320, 1637050380, 1637050440, 1637050500,
                         1637050560, 1637050620, 1637050680, 1637050740, 1637050800, 1637050860, 1637050920, 1637050980,
                         1637051040, 1637051100, 1637051160, 1637051220, 1637051280, 1637051340, 1637051400, 1637051460,
                         1637051520, 1637051580, 1637051640, 1637051700, 1637051760, 1637051820, 1637051880, 1637051940,
                         1637052000, 1637052060, 1637052120, 1637052180, 1637052240, 1637052300, 1637052360, 1637052420,
                         1637052480, 1637052540, 1637052600, 1637052660, 1637052720, 1637052780, 1637052840, 1637052900,
                         1637052960, 1637053020, 1637053080, 1637053140, 1637053200, 1637053260, 1637053320, 1637053380,
                         1637053440, 1637053500, 1637053560, 1637053620, 1637053680, 1637053740, 1637053800, 1637053860,
                         1637053920, 1637053980, 1637054040, 1637054100, 1637054160, 1637054220, 1637054280, 1637054340,
                         1637054400, 1637054460, 1637054520, 1637054580, 1637054640, 1637054700, 1637054760, 1637054820,
                         1637054880, 1637054940, 1637055000, 1637055060, 1637055120, 1637055180, 1637055240, 1637055300,
                         1637055360, 1637055420, 1637055480, 1637055540, 1637055600, 1637055660, 1637055720, 1637055780,
                         1637055840, 1637055900, 1637055960, 1637056020, 1637056080, 1637056140, 1637056200, 1637056260,
                         1637056320, 1637056380, 1637056440, 1637056500, 1637056560, 1637056620, 1637056680, 1637056740,
                         1637056800, 1637056860, 1637056920, 1637056980, 1637057040, 1637057100, 1637057160, 1637057220,
                         1637057280, 1637057340, 1637057400, 1637057460, 1637057520, 1637057580, 1637057640, 1637057700,
                         1637057760, 1637057820, 1637057880, 1637057940, 1637058000, 1637058060, 1637058120, 1637058180,
                         1637058240, 1637058300, 1637058360, 1637058420, 1637058480, 1637058540, 1637058600, 1637058660,
                         1637058720, 1637058780, 1637058840, 1637058900, 1637058960, 1637059020, 1637059080, 1637059140,
                         1637059200, 1637059260, 1637059320, 1637059380, 1637059440, 1637059500, 1637059560, 1637059620,
                         1637059680, 1637059740, 1637059800, 1637059860, 1637059920, 1637059980, 1637060040, 1637060100,
                         1637060160, 1637060220, 1637060280, 1637060340, 1637060400, 1637060460, 1637060520, 1637060580,
                         1637060640, 1637060700, 1637060760, 1637060820, 1637060880, 1637060940, 1637061000, 1637061060,
                         1637061120, 1637061180, 1637061240, 1637061300, 1637061360, 1637061420, 1637061480, 1637061540,
                         1637061600, 1637061660, 1637061720, 1637061780, 1637061840, 1637061900, 1637061960, 1637062020,
                         1637062080, 1637062140, 1637062200, 1637062260, 1637062320, 1637062380, 1637062440, 1637062500,
                         1637062560, 1637062620, 1637062680, 1637062740, 1637062800, 1637062860, 1637062920, 1637062980,
                         1637063040, 1637063100, 1637063160, 1637063220, 1637063280, 1637063340, 1637063400, 1637063460,
                         1637063520, 1637063580, 1637063640, 1637063700, 1637063760, 1637063820, 1637063880, 1637063940,
                         1637064000, 1637064060, 1637064120, 1637064180, 1637064240, 1637064300, 1637064360, 1637064420,
                         1637064480, 1637064540, 1637064600, 1637064660, 1637064720, 1637064780, 1637064840, 1637064900,
                         1637064960, 1637065020, 1637065080, 1637065140, 1637065200, 1637065260, 1637065320, 1637065380,
                         1637065440, 1637065500, 1637065560, 1637065620, 1637065680, 1637065740, 1637065800, 1637065860,
                         1637065920, 1637065980, 1637066040, 1637066100, 1637066160, 1637066220, 1637066280, 1637066340,
                         1637066400, 1637066460, 1637066520, 1637066580, 1637066640, 1637066700, 1637066760, 1637066820,
                         1637066880, 1637066940, 1637067000, 1637067060, 1637067120, 1637067180, 1637067240, 1637067300,
                         1637067360, 1637067420, 1637067480, 1637067540, 1637067600, 1637067660, 1637067720, 1637067780,
                         1637067840, 1637067900, 1637067960, 1637068020, 1637068080, 1637068140, 1637068200, 1637068260,
                         1637068320, 1637068380, 1637068440, 1637068500, 1637068560, 1637068620, 1637068680, 1637068740,
                         1637068800, 1637068860, 1637068920, 1637068980, 1637069040, 1637069100, 1637069160, 1637069220,
                         1637069280, 1637069340, 1637069400, 1637069460, 1637069520, 1637069580, 1637069640, 1637069700,
                         1637069760, 1637069820, 1637069880, 1637069940, 1637070000, 1637070060, 1637070120, 1637070180,
                         1637070240, 1637070300, 1637070360, 1637070420, 1637070480, 1637070540, 1637070600, 1637070660,
                         1637070720, 1637070780, 1637070840, 1637070900, 1637070960, 1637071020, 1637071080, 1637071140,
                         1637071200, 1637071260, 1637071320, 1637071380, 1637071440, 1637071500, 1637071560, 1637071620,
                         1637071680, 1637071740, 1637071800, 1637071860, 1637071920, 1637071980, 1637072040, 1637072100,
                         1637072160, 1637072220, 1637072280, 1637072340, 1637072400, 1637072460, 1637072520, 1637072580,
                         1637072640, 1637072700, 1637072760, 1637072820, 1637072880, 1637072940, 1637073000, 1637073060,
                         1637073120, 1637073180, 1637073240, 1637073300, 1637073360, 1637073420, 1637073480, 1637073540,
                         1637073600, 1637073660, 1637073720, 1637073780, 1637073840, 1637073900, 1637073960, 1637074020,
                         1637074080, 1637074140, 1637074200, 1637074260, 1637074320, 1637074380, 1637074440, 1637074500,
                         1637074560, 1637074620, 1637074680, 1637074740, 1637074800, 1637074860, 1637074920, 1637074980,
                         1637075040, 1637075100, 1637075160, 1637075220, 1637075280, 1637075340, 1637075400, 1637075460,
                         1637075520, 1637075580, 1637075640, 1637075700, 1637075760, 1637075820, 1637075880, 1637075940,
                         1637076000, 1637076060, 1637076120, 1637076180, 1637076240, 1637076300, 1637076360, 1637076420,
                         1637076480, 1637076540, 1637076600, 1637076660, 1637076720, 1637076780, 1637076840, 1637076900,
                         1637076960, 1637077020, 1637077080, 1637077140, 1637077200, 1637077260, 1637077320, 1637077380,
                         1637077440, 1637077500, 1637077560, 1637077620, 1637077680, 1637077740, 1637077800, 1637077860,
                         1637077920, 1637077980, 1637078040, 1637078100, 1637078160, 1637078220, 1637078280, 1637078340]
test_spike_data = [50.49714285714286, 27.55818181818182, 17.876666666666665, 17.64, 16.908333333333335, 17.195, 16.25,
                   16.271666666666665, 16.618333333333336, 16.71166666666667, 17.383333333333333, 16.226666666666667,
                   15.996666666666668, 15.633333333333333, 15.67, 16.816666666666666, 15.665, 15.468333333333332,
                   15.936666666666667, 15.543333333333331, 15.645454545454545, 15.058333333333332, 15.15,
                   15.05833333333333, 15.931666666666665, 16.008333333333336, 16.475, 15.366666666666667,
                   15.188333333333338, 15.913333333333334, 20.14666666666667, 22.87, 18.926666666666662,
                   16.439999999999998, 24.28833333333333, 15.173333333333332, 14.101666666666668, 20.433333333333334,
                   18.52166666666667, 19.62666666666667, 16.103333333333335, 13.133333333333333, 13.48,
                   13.953333333333331, 13.858333333333334, 13.76, 13.005, 12.878333333333336, 13.368333333333338,
                   12.831666666666669, 13.201666666666666, 12.605000000000004, 13.015, 13.083333333333336, 13.055,
                   13.05, 12.496666666666664, 12.906666666666666, 12.880000000000004, 13.785000000000002,
                   18.101666666666667, 13.175, 13.493333333333332, 13.528333333333334, 13.591666666666669,
                   14.105000000000002, 13.06333333333333, 13.48, 13.831666666666663, 13.566666666666668,
                   13.421666666666663, 13.093333333333334, 13.116666666666667, 13.016666666666667, 13.138333333333334,
                   12.676666666666668, 13.02833333333333, 12.621666666666668, 13.058333333333332, 12.341666666666669,
                   12.331666666666669, 12.273333333333335, 12.166666666666666, 12.14333333333333, 12.37833333333333,
                   12.345, 13.458333333333334, 12.095, 12.120000000000005, 12.418333333333337, 13.288333333333332,
                   20.25, 15.208333333333334, 13.27833333333333, 21.25833333333333, 11.931666666666668,
                   10.958333333333334, 17.083333333333332, 16.720000000000002, 17.195, 13.365000000000002,
                   10.785000000000002, 11.031666666666666, 11.25, 11.045, 10.749999999999998, 10.795, 10.78, 11.835,
                   11.165, 10.603333333333332, 10.186666666666666, 10.386666666666668, 10.476666666666665,
                   10.249999999999998, 10.678333333333333, 10.078333333333337, 10.025, 10.246666666666668,
                   10.691666666666668, 14.105000000000002, 10.061666666666666, 10.091666666666669, 9.898333333333332,
                   10.003333333333336, 9.908333333333331, 9.358333333333333, 9.438333333333333, 9.845,
                   9.501666666666663, 9.756666666666666, 9.023333333333332, 9.02, 9.325, 9.376666666666669, 9.76,
                   9.231666666666666, 9.058333333333334, 9.575, 9.285, 9.766666666666667, 8.623333333333333,
                   9.148333333333332, 8.806666666666667, 8.95, 9.663333333333332, 11.004999999999995, 8.959999999999999,
                   9.276666666666666, 9.111666666666666, 9.61, 17.965, 12.825000000000005, 10.582, 19.18, 9.38,
                   8.218333333333334, 14.598333333333334, 12.828333333333337, 14.485, 10.88, 7.883333333333334,
                   8.188333333333334, 8.651666666666666, 8.264999999999999, 9.375, 8.076666666666666, 8.418333333333335,
                   8.783333333333333, 8.076666666666668, 8.863333333333333, 7.748333333333334, 8.073333333333332,
                   8.26833333333333, 8.266666666666667, 8.418333333333333, 8.180000000000001, 8.151666666666667,
                   8.733333333333333, 8.231666666666666, 10.875, 8.29, 8.643333333333333, 8.928333333333333,
                   8.353333333333333, 8.533333333333333, 8.123333333333333, 7.918333333333333, 8.406666666666668,
                   8.231666666666667, 8.518333333333333, 7.726666666666667, 7.831666666666666, 8.08, 7.981666666666666,
                   8.360000000000001, 7.765, 8.124999999999998, 8.305, 8.333333333333334, 8.405, 8.266666666666667,
                   8.056666666666667, 7.838333333333334, 8.219999999999999, 8.233333333333333, 10.07, 8.256666666666666,
                   8.718333333333334, 8.356666666666666, 10.173333333333334, 17.173333333333332, 11.94833333333333,
                   9.663333333333336, 18.17833333333333, 8.514999999999999, 8.04, 14.570000000000002, 13.13,
                   13.908333333333337, 10.395, 7.495000000000001, 7.85, 8.115, 7.951666666666665, 7.995,
                   7.696666666666668, 8.115, 8.171666666666667, 8.316666666666666, 8.056666666666667, 7.466666666666666,
                   7.686666666666666, 8.328333333333335, 8.093333333333334, 7.956666666666667, 7.600000000000001,
                   7.788333333333333, 8.196666666666667, 8.391666666666666, 26.73, 7.828333333333336, 8.071666666666669,
                   8.214999999999998, 8.013333333333334, 8.46, 7.565, 7.798333333333333, 7.916666666666667, 7.94,
                   7.988333333333333, 7.383333333333335, 7.626666666666668, 8.01, 7.829999999999999, 8.280000000000001,
                   7.763333333333332, 7.555, 8.254999999999999, 7.704999999999999, 8.42, 7.191666666666666,
                   7.226666666666667, 7.728333333333334, 7.646666666666667, 8.023333333333333, 9.55, 7.518333333333333,
                   7.664999999999999, 7.63, 9.148333333333332, 16.491666666666667, 11.776, 9.067272727272728,
                   17.728333333333335, 8.155000000000001, 7.653333333333332, 14.471666666666664, 12.501666666666663,
                   13.795000000000002, 10.803333333333333, 7.376666666666666, 7.698333333333334, 7.423333333333335,
                   7.796666666666668, 8.046666666666669, 7.606666666666666, 7.886666666666667, 7.958333333333332,
                   8.141666666666666, 8.528333333333334, 7.3066666666666675, 7.908333333333332, 8.126666666666665,
                   7.838333333333331, 8.715, 7.675, 8.026666666666666, 8.098333333333334, 8.053333333333333,
                   13.396666666666668, 7.919999999999999, 7.774999999999999, 8.168333333333335, 8.108333333333333,
                   8.596666666666668, 7.91, 8.018333333333333, 8.39, 7.918333333333333, 8.608333333333334, 7.55,
                   7.933333333333333, 7.861666666666668, 7.953333333333334, 9.021666666666668, 7.781666666666666,
                   7.913333333333334, 8.158333333333335, 7.963333333333334, 9.316666666666665, 7.811666666666665,
                   7.729999999999999, 8.418333333333333, 8.381666666666666, 8.785000000000002, 10.248333333333331,
                   8.090000000000002, 8.680000000000001, 9.301666666666666, 12.229999999999997, 18.375,
                   12.188333333333334, 10.171666666666669, 18.40833333333333, 9.321666666666667, 8.598333333333331,
                   15.066666666666665, 13.590000000000002, 14.821666666666667, 12.108333333333333, 8.40181818181818,
                   8.888333333333335, 8.831666666666665, 8.985, 10.141666666666667, 8.526666666666667,
                   8.876666666666667, 9.016666666666667, 9.166666666666666, 10.348333333333333, 9.031666666666666,
                   9.475, 9.896666666666668, 10.138333333333334, 10.706666666666663, 9.035, 9.733333333333334,
                   10.208333333333334, 10.19, 56.93666666666667, 11.492727272727272, 11.091666666666669, 11.17,
                   11.105000000000002, 12.395, 10.708333333333334, 10.846666666666666, 10.745, 11.123333333333337,
                   13.161666666666669, 11.515, 11.18, 11.116666666666667, 11.086666666666666, 12.620000000000005,
                   11.366666666666667, 12.383333333333336, 12.168333333333337, 11.638333333333334, 19.27,
                   13.656666666666665, 12.828333333333337, 16.736666666666668, 14.1, 14.613333333333332,
                   15.519999999999998, 13.365, 13.343333333333334, 13.916666666666666, 25.261666666666667, 25.285,
                   21.184, 16.19333333333333, 26.68166666666667, 19.91, 14.961666666666666, 22.42166666666667,
                   22.95833333333333, 21.581666666666667, 22.93166666666666, 16.330000000000002, 15.784999999999998,
                   15.45, 15.593333333333328, 18.22, 15.171666666666663, 16.645, 17.833333333333332, 16.561666666666667,
                   19.77, 17.02, 18.966666666666665, 17.404999999999998, 17.143333333333327, 18.575000000000003,
                   16.40666666666667, 20.085, 21.25833333333333, 20.66, 50.86833333333333, 23.696666666666665,
                   20.15833333333333, 19.23, 18.30666666666667, 19.435, 17.305000000000003, 18.38833333333333,
                   19.031666666666663, 17.76833333333333, 22.02, 17.89166666666667, 17.75166666666667,
                   18.26833333333333, 17.61666666666667, 21.66166666666666, 20.496666666666663, 19.01833333333333,
                   18.811666666666667, 18.136666666666667, 23.318333333333328, 19.065, 18.62333333333333,
                   18.33666666666667, 19.12, 20.06, 20.28, 18.78833333333333, 20.891666666666666, 20.65833333333333,
                   34.00166666666667, 29.28, 24.040000000000003, 20.925454545454546, 29.219999999999995, 21.275,
                   18.61090909090909, 24.218333333333334, 24.46, 24.99833333333333, 25.47833333333333,
                   18.946666666666665, 18.305000000000003, 18.76, 18.425, 20.29, 18.258333333333336, 18.351666666666667,
                   18.126666666666665, 19.00666666666667, 21.03, 18.055, 18.348333333333333, 18.52, 18.135000000000005,
                   19.476666666666667, 19.08, 18.17166666666667, 19.65833333333333, 20.821666666666665,
                   61.95333333333334, 35.64833333333333, 21.77333333333333, 20.415000000000003, 20.275,
                   20.651666666666667, 19.313333333333336, 19.31, 19.423333333333336, 18.901666666666667,
                   22.49833333333333, 18.371666666666663, 18.718333333333334, 18.65, 17.566666666666666,
                   19.566666666666663, 17.933333333333334, 17.34, 18.426666666666662, 18.195, 20.69, 18.03, 18.52,
                   18.58333333333333, 18.695000000000004, 19.308333333333334, 19.701666666666668, 18.205, 19.035, 18.82,
                   46.70499999999999, 29.041818181818183, 23.061666666666664, 20.141666666666666, 28.31, 19.505,
                   17.656666666666663, 24.65833333333333, 22.723333333333333, 23.83, 21.67, 18.065, 17.55666666666667,
                   18.798333333333336, 17.99666666666667, 18.611666666666668, 18.371666666666663, 18.23,
                   17.851666666666663, 17.686666666666664, 19.11666666666667, 17.793333333333333, 18.081666666666663,
                   17.78333333333333, 17.764999999999997, 18.81833333333333, 17.926666666666666, 17.786666666666665,
                   18.651666666666667, 18.861666666666665, 86.39166666666667, 74.06666666666666, 50.57666666666666,
                   49.47, 47.36000000000001, 47.38333333333333, 41.00833333333333, 24.30333333333333,
                   19.313333333333336, 19.38666666666667, 20.185, 19.76833333333333, 18.898333333333333,
                   18.648333333333333, 18.34, 19.365, 17.669999999999998, 18.003333333333334, 18.235,
                   18.011666666666667, 18.468333333333334, 17.62666666666667, 18.131666666666664, 18.011666666666667,
                   17.736666666666668, 18.786666666666665, 19.951666666666668, 18.36666666666667, 18.66166666666667,
                   20.098333333333336, 23.801666666666662, 27.24833333333333, 21.96666666666667, 19.783636363636365,
                   27.76333333333333, 18.8, 17.611666666666668, 25.183333333333334, 23.341666666666665, 23.935,
                   20.51833333333333, 18.493333333333336, 17.80666666666667, 17.94666666666667, 18.76833333333333,
                   19.57333333333333, 17.915000000000003, 17.33, 18.065, 18.131666666666664, 18.263333333333332,
                   17.58666666666667, 17.633333333333336, 18.12833333333333, 18.508333333333333, 18.453333333333337,
                   18.015, 18.41, 18.203333333333333, 19.85, 33.041666666666664, 19.35833333333333, 18.666666666666664,
                   18.575, 18.736666666666668, 19.19833333333333, 18.74833333333333, 18.68166666666667,
                   18.756666666666664, 18.791666666666668, 18.88, 18.361666666666668, 18.165000000000003,
                   18.078333333333333, 18.73333333333333, 18.716666666666665, 17.941666666666666, 18.47,
                   18.433333333333334, 17.845000000000002, 18.896666666666665, 18.50166666666667, 18.25166666666667,
                   18.50833333333333, 18.081666666666667, 18.596666666666668, 20.065, 17.716666666666665, 18.595, 19.09,
                   21.882, 27.146666666666665, 23.24833333333333, 19.89, 28.42, 19.2, 17.993333333333332,
                   23.445000000000004, 23.481666666666666, 24.251666666666665, 20.49333333333333, 17.89833333333333,
                   17.650000000000002, 17.62, 18.165000000000003, 19.031666666666663, 18.416666666666664,
                   18.165000000000003, 17.789999999999996, 17.73, 18.52, 17.226666666666663, 17.388333333333335, 17.985,
                   18.285, 18.035, 17.715, 18.563333333333333, 18.62833333333333, 17.59, 29.563333333333333,
                   19.223333333333333, 18.25333333333333, 18.74, 18.225, 18.78, 18.15833333333333, 17.83666666666667,
                   19.183333333333334, 18.19333333333333, 19.31, 18.23333333333333, 18.27833333333333,
                   18.083333333333336, 17.69666666666667, 18.881666666666664, 17.768333333333334, 18.509999999999994,
                   18.911666666666665, 18.295, 18.78833333333333, 18.245, 18.35, 18.77, 18.221666666666668, 18.855,
                   20.695000000000004, 18.793333333333333, 18.70833333333333, 19.31333333333333, 22.66333333333333,
                   28.531666666666663, 22.953333333333333, 21.576666666666664, 29.406666666666663, 20.156666666666663,
                   19.331666666666667, 25.648333333333337, 23.926666666666662, 25.25333333333334, 21.885,
                   18.456666666666667, 18.87333333333333, 18.836666666666662, 19.08, 20.58, 18.711666666666662,
                   19.453333333333333, 19.866666666666667, 19.22833333333333, 20.17833333333333, 18.98,
                   19.66166666666667, 19.445, 19.37, 19.475000000000005, 20.32, 20.131666666666664, 19.59,
                   21.846666666666664, 87.53272727272729, 75.71666666666665, 51.86833333333333, 50.93500000000001,
                   49.33833333333333, 49.403333333333336, 38.26833333333334, 25.041666666666668, 24.63833333333333,
                   24.063333333333333, 22.741666666666664, 20.703333333333333, 20.96333333333333, 20.161666666666665,
                   20.156666666666663, 21.066666666666663, 19.96166666666667, 19.545, 19.645000000000003,
                   20.276666666666667, 20.92, 19.226666666666667, 19.178333333333335, 19.75833333333333, 20.015,
                   19.616666666666664, 21.225, 20.011666666666667, 19.58, 20.828000000000003, 25.456666666666663,
                   28.955, 23.831666666666667, 21.53, 29.438333333333336, 21.10833333333333, 19.348333333333333,
                   25.901666666666667, 24.891666666666666, 25.56833333333333, 22.035, 19.138333333333332,
                   19.543333333333333, 19.55666666666667, 19.355, 19.67333333333333, 19.093333333333334,
                   18.76333333333333, 19.540000000000003, 19.485, 20.295, 18.91, 19.545, 19.55, 19.466666666666665,
                   19.28833333333333, 19.578333333333333, 19.24333333333333, 19.58, 19.540000000000003,
                   26.523333333333337, 19.30666666666667, 20.155, 18.69, 19.510909090909088, 18.19333333333333,
                   18.840000000000003, 18.786666666666665, 18.48333333333333, 19.605, 19.093333333333334,
                   18.166666666666668, 18.63833333333333, 18.78, 18.936666666666667, 18.52, 17.708333333333332, 18.395,
                   18.515, 18.295, 19.523333333333337, 18.238333333333333, 18.37333333333333, 19.06, 17.895,
                   18.64666666666667, 19.885, 18.35, 17.965, 18.58833333333333, 20.926666666666662, 27.343333333333334,
                   22.60333333333333, 20.06, 28.036666666666665, 18.85333333333333, 18.695, 23.52, 23.64333333333333,
                   24.035, 20.601666666666663, 17.62, 17.716666666666665, 18.4, 17.86363636363636, 17.89,
                   17.196666666666665, 17.781666666666666, 18.48, 18.05666666666667, 19.000000000000004, 17.965,
                   17.820000000000004, 17.989090909090912, 17.081666666666667, 18.43333333333333, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                   0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]


def test_seasonal_detector():
    input_data = [10, 20, 30, 40] * 20 + [1, 1, 1, 1] * 5 + [10, 20, 30, 40] * 20
    raw_data = Sequence(timestamps=list(range(len(input_data))), values=input_data)
    model = anomaly_detection.SeasonalDetector(outliers=(2, 2), side="negative")
    res = model.fit_predict(raw_data)
    correct_data = (
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, True,
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False, False
    )
    assert res.values == correct_data


def test_level_shift_detector():
    input_data = list(range(10)) * 5 + [100] * 10
    raw_data = Sequence(timestamps=list(range(len(input_data))), values=input_data)
    model = anomaly_detection.LevelShiftDetector(window=5, side='positive')
    res = model.fit_predict(raw_data)
    correct_data = (
        True, True, True, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, True, True,
        True, True, True, True, True, True, True, True, True, True
    )
    assert res.values == correct_data


def test_spike_detector():
    input_data = [0, 1, 0, 1, 0, 0, 1, -15, -1, -2, 1, 1, 1, 0] + [1, 0] * 8
    raw_data = Sequence(timestamps=list(range(len(input_data))), values=input_data)
    model = anomaly_detection.SpikeDetector(window=2, side="negative")
    res = model.fit_predict(raw_data)

    correct_data = (
        False, False, False, False, False, False, False, True, False, False,
        False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False
    )

    assert res.values == correct_data


def test_volatility_shift_detector():
    input_data = [0, 1] * 40 + [100, -100] * 10
    raw_data = Sequence(timestamps=list(range(len(input_data))), values=input_data)
    model = anomaly_detection.VolatilityShiftDetector(outliers=(None, 3), window=10)
    res = model.fit_predict(raw_data)
    correct_data = (
        False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, True, True, True, True,
        True, True, True, True, True, True, True, True, True, True,
        True, True, True, True, True, True, True, True, True, True
    )

    assert res.values == correct_data


def test_increase_detector():
    input_data = [i for i in list(range(50))] + [i for i in list(range(50))][::-1]
    raw_data = Sequence(timestamps=list(range(len(input_data))), values=input_data)
    model = anomaly_detection.IncreaseDetector(side="positive", window=20, max_coef=0.3)
    res = model.fit_predict(raw_data)
    correct_data = (
        True, True, True, True, True, True, True, True, True, True,
        True, True, True, True, True, True, True, True, True, True,
        True, True, True, True, True, True, True, True, True, True,
        True, True, True, True, True, True, True, True, True, True,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False
    )
    assert res.values == correct_data


def test_merge_contiguous_anomalies_timestamps():
    func = anomaly_detection._utils.merge_contiguous_anomalies_timestamps
    assert func([0, 1, 2, 3, 4, 5, 6], [2, 4, 5]) == [[2], [4, 5]]
    assert func([0, 1, 2, 3, 4, 5], [2, 4, 5]) == [[2], [4, 5]]
    assert func([0, 1, 2, 3, 4, 5], [2, 3, 4, 5]) == [[2, 3, 4, 5]]
    assert func([0, 1, 2, 3, 4, 5], [0, 2, 5]) == [[0], [2], [5]]
    assert func([0, 1, 2, 5], [0, 2, 5]) == [[0], [2, 5]]
    assert func([0, 1, 2], [0, 1, 2]) == [[0, 1, 2]]


def test_pick_out_anomalies():
    func = anomaly_detection.pick_out_anomalies

    sequence = Sequence(range(5), range(5))
    anomalies0 = Sequence(range(5), [True, True, False, False, False])
    assert func(sequence, anomalies0) == []
    anomalies1 = Sequence(range(5), [True, False, False, False, True])
    assert func(sequence, anomalies1) == []
    anomalies2 = Sequence(range(5), [False, False, True, False, False])
    assert func(sequence, anomalies2) == [Sequence([2], [2])]
    anomalies3 = Sequence(range(5), [True, True, False, True, False])
    assert func(sequence, anomalies3) == [Sequence([3], [3])]
    anomalies4 = Sequence(range(5), [False, True, False, True, False])
    assert func(sequence, anomalies4) == [Sequence([1], [1]), Sequence([3], [3])]
    anomalies5 = Sequence(range(5), [False, True, True, True, False])
    assert func(sequence, anomalies5) == [Sequence([1, 2, 3], [1, 2, 3])]


def test_gradient_detector():
    sequence = Sequence(test_spike_timestamps[300:500], test_spike_data[300:500])
    detector = anomaly_detection.GradientDetector(side='positive', max_coef=0.001, timed_window=300)
    anomalies = detector.fit_predict(sequence)
    assert True not in anomalies.values

    sequence = Sequence(test_spike_timestamps[500:700], test_spike_data[500:700])
    detector = anomaly_detection.GradientDetector(side='positive', max_coef=0.001, timed_window=300)
    anomalies = detector.fit_predict(sequence)
    assert True in anomalies.values
